package cc.rengu.igas.share.core.service.channel.wechat;

import cc.rengu.igas.channel.wechat.facade.base.Header;
import cc.rengu.igas.channel.wechat.facade.request.WechatAcquireTermInfoRequest;
import cc.rengu.igas.channel.wechat.facade.response.WechatAcquireTermInfoResponse;
import cc.rengu.igas.channel.wechat.facade.result.Result;
import cc.rengu.igas.share.common.constant.ShareParamConstant;
import cc.rengu.igas.share.common.constant.ShareServiceConstant;
import cc.rengu.igas.share.core.model.MchntInfo;
import cc.rengu.igas.share.core.model.MchntTermInfo;
import cc.rengu.igas.share.core.realize.MchntService;
import cc.rengu.igas.share.core.realize.impl.MchntServiceImpl;
import cc.rengu.oltp.service.base.ChannelBaseService;
import cc.rengu.oltp.service.common.constant.AppParamConstant;
import cc.rengu.oltp.service.common.constant.TreeNodeConstant;
import cc.rengu.oltp.service.common.entity.ChannelCallCfg;
import cc.rengu.oltp.service.common.entity.PayOrderInfo;
import cc.rengu.oltp.service.common.enums.ChannelCallModeEnum;
import cc.rengu.oltp.service.common.enums.OltpRpcdEnum;
import cc.rengu.oltp.service.common.enums.TransStatusEnum;
import cc.rengu.oltp.service.model.BizException;
import cc.rengu.oltp.service.model.BizResponse;
import cc.rengu.oltp.service.model.OrderInfo;
import cc.rengu.oltp.service.model.TxnInfo;
import cc.rengu.oltp.service.realize.DubboService;
import cc.rengu.oltp.service.realize.impl.DubboServiceImpl;
import cc.rengu.oltp.utility.util.ConvertUtil;
import cc.rengu.oltp.utility.util.StringUtil;
import cc.rengu.oltp.utility.util.XmlTreeUtil;
import com.alibaba.fastjson.JSON;

/**
 * 微信终端信息采集
 *
 * @author yangfan
 * @version 1.0
 * @date 2022/3/17
 */
public class WechatAcquireTermInfoService extends ChannelBaseService {
    @Override
    public Object callPreProc(TxnInfo txnInfo, ChannelCallCfg channelCallCfg, OrderInfo orderInfo) throws Exception {
        XmlTreeUtil xmlTreeUtil = new XmlTreeUtil();
        Header wxHeader = new Header();
        wxHeader.setInstId(xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.INST_ID));
        wxHeader.setChanlId(channelCallCfg.getMsgSrcId());
        wxHeader.setSrcSysId(AppParamConstant.SYS_ID);
        wxHeader.setBizType(AppParamConstant.DEFAULT_BIZ_TYPE);
        wxHeader.setVersion(ShareParamConstant.DUBBO_VSERSION);
        wxHeader.setTxnNum(channelCallCfg.getCallChannelTxn());
        wxHeader.setTraceNo(xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.SYS_SEQ_NUM) + channelCallCfg.getCallIndex());
        wxHeader.setTransTime(xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.TRANS_TIME));
        wxHeader.setTransDate(xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.TRANS_DATE));
        WechatAcquireTermInfoRequest wechatAcquireTermInfoRequest = new WechatAcquireTermInfoRequest();
        ConvertUtil.convertOutput(wechatAcquireTermInfoRequest);

        MchntService mchntService = new MchntServiceImpl();
        String mchntNo = xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.MCHNT_NO);
        String termNo = xmlTreeUtil.getXmlTreeStringValue(TreeNodeConstant.TERM_NO);
        MchntInfo mchntInfo = mchntService.getMchntInfo(channelCallCfg.getInstId(), mchntNo);
        if (null == mchntInfo) {
            rglog.error("商户信息为空！");
            return null;
        }
        MchntTermInfo mchntTermInfo = mchntService.getMchntTermInfo(mchntInfo.getInstId(), mchntNo,termNo);
        if (null == mchntTermInfo) {
            rglog.error("终端信息信息为空！");
            return null;
        }
        wechatAcquireTermInfoRequest.setHeader(wxHeader);
        wechatAcquireTermInfoRequest.setChannelId(channelCallCfg.getCallChannelId());
        wechatAcquireTermInfoRequest.setChannelType(mchntInfo.getWechatChannelType());
        wechatAcquireTermInfoRequest.setThirdMchntNo(mchntInfo.getWechatMchntNo());
        wechatAcquireTermInfoRequest.setOperateId(xmlTreeUtil.getXmlTreeStringValue("opType"));
        wechatAcquireTermInfoRequest.setTermNo(mchntTermInfo.getTermNo());
        wechatAcquireTermInfoRequest.setMchntName(mchntInfo.getMchntName());
        wechatAcquireTermInfoRequest.setTermType(mchntTermInfo.getTermType());
        wechatAcquireTermInfoRequest.setTermState(xmlTreeUtil.getXmlTreeStringValue("termState"));
        wechatAcquireTermInfoRequest.setSerialNum(mchntTermInfo.getTermSn());
        wechatAcquireTermInfoRequest.setTermAddress(getMerBusiAddress(mchntInfo));
        wechatAcquireTermInfoRequest.setMerRemark(mchntInfo.getMchntNo());
        rglog.debug("微信终端信息采集请求:<{}>", JSON.toJSONString(wechatAcquireTermInfoRequest));

        return wechatAcquireTermInfoRequest;
    }

    @Override
    public PayOrderInfo generatePayOrderInfo(ChannelCallCfg channelCallCfg, OrderInfo orderInfo, Object request) throws Exception {
        return null;
    }

    @Override
    public Object callProc(ChannelCallCfg channelCallCfg, Object request) throws Exception {
        WechatAcquireTermInfoRequest wechatAcquireTermInfoRequest = (WechatAcquireTermInfoRequest) request;
        /* Step1：调用接口，获取结果 */
        Result<WechatAcquireTermInfoResponse> callResult;
        DubboService dubboService = new DubboServiceImpl();
        if (AppParamConstant.YES.equals(channelCallCfg.getSyncCallFlag())) {
            /* Step1.1：异步调用 */
            int iReturnCode;
            int callTimes = 0 == channelCallCfg.getSyncQueryRepeatNum() ? 1 : channelCallCfg.getSyncQueryRepeatNum();
            int gatTime = channelCallCfg.getSyncQueryRepeatTime();
            int gatType = StringUtil.isEmptyOrNull(channelCallCfg.getSyncQueryGapType()) ? 0 : Integer.parseInt(channelCallCfg.getSyncQueryGapType());
            if (ChannelCallModeEnum.LOCAL.getMode().equals(channelCallCfg.getChannelCallMode())) {
                /* Step1.1.1：异步应用内调用 */
                Class clasz = Class.forName(ShareServiceConstant.WECHAT_MCHNT_SERVICE_INNER_PATH);
                iReturnCode = dubboService.asynCallDubboInnerMethod(clasz, ShareServiceConstant.WECHAT_ACQUIRE_TERM_INFO_METHOD, wechatAcquireTermInfoRequest, channelCallCfg.getSyncResultServiceName(), callTimes, gatType, gatTime);
            } else if (ChannelCallModeEnum.REMOTE.getMode().equals(channelCallCfg.getChannelCallMode())) {
                /* Step1.1.2：异步远程调用 */
                iReturnCode = dubboService.asynCallDubboService(ShareServiceConstant.WECHAT_MCHNT_SERVICE, ShareServiceConstant.WECHAT_ACQUIRE_TERM_INFO_METHOD, wechatAcquireTermInfoRequest, channelCallCfg.getSyncResultServiceName(), callTimes, gatType, gatTime);
            } else {
                rglog.error("不支持的通道服务调用方式:{}，交易拒绝!", channelCallCfg.getChannelCallMode());
                throw new BizException(OltpRpcdEnum.CALL_BIZ_SERVICE_ERROR);
            }
            if (0 == iReturnCode) {
                return new BizResponse<>(OltpRpcdEnum.TRANS_SUCCESS.getRespCode(), OltpRpcdEnum.TRANS_SUCCESS.getRespDesc());
            } else {
                return new BizResponse<>(OltpRpcdEnum.CALL_BIZ_SERVICE_ERROR.getRespCode(), OltpRpcdEnum.CALL_BIZ_SERVICE_ERROR.getRespDesc());
            }
        } else {
            /* Step1.2：同步调用 */
            if (ChannelCallModeEnum.LOCAL.getMode().equals(channelCallCfg.getChannelCallMode())) {
                /* Step1.2.1：同步应用内调用 */
                Class clasz = Class.forName(ShareServiceConstant.WECHAT_MCHNT_SERVICE_INNER_PATH);
                callResult = (Result<WechatAcquireTermInfoResponse>) dubboService.callDubboInnerMethod(clasz, ShareServiceConstant.WECHAT_ACQUIRE_TERM_INFO_METHOD, wechatAcquireTermInfoRequest);
            } else if (ChannelCallModeEnum.REMOTE.getMode().equals(channelCallCfg.getChannelCallMode())) {
                /* Step1.2.2：同步远程调用 */
                callResult = (Result<WechatAcquireTermInfoResponse>) dubboService.callDubboService(ShareServiceConstant.WECHAT_MCHNT_SERVICE, ShareServiceConstant.WECHAT_ACQUIRE_TERM_INFO_METHOD, wechatAcquireTermInfoRequest);
            } else {
                rglog.error("不支持的通道服务调用方式:{}，交易拒绝!", channelCallCfg.getChannelCallMode());
                throw new BizException(OltpRpcdEnum.CALL_BIZ_SERVICE_ERROR);
            }
        }
        return callResult;
    }

    @Override
    public Object querySyncCallResult(PayOrderInfo payOrderInfo, Object request) {
        return null;
    }

    @Override
    public OrderInfo callResultOrderProc(OrderInfo orderInfo, String payOrderIndex, TransStatusEnum transStatusEnum, Object response) {
        return null;
    }

    /**
     * 获取商户经营地址 终端布放地址: 省-市-区-详细地址
     *
     * @param mchntInfo 商户信息
     * @return 终端布放地址
     * @throws Exception 异常
     */
    private String getMerBusiAddress(MchntInfo mchntInfo) throws Exception {
        XmlTreeUtil xmlTreeUtil = new XmlTreeUtil();
        String mchntBizProvinceName = xmlTreeUtil.getXmlTreeStringValue("mchntBizProvinceName");
        String mchntBizCityName = xmlTreeUtil.getXmlTreeStringValue("mchntBizCityName");
        String mchntBizRegionName = xmlTreeUtil.getXmlTreeStringValue("mchntBizRegionName");
        return String.format("%s-%s-%s-%s", mchntBizProvinceName, mchntBizCityName, mchntBizRegionName, mchntInfo.getMchntBizAddr());
    }
}
